#pragma once
#ifndef CONFIGURATION_HPP
#define CONFIGURATION_HPP
#include <string>
#include <unordered_map>
#include <memory>
#include <mutex>
using namespace std;
namespace jpx{
class Configuration
{
public:
    //删除拷贝构造函数以及赋值运算符函数
    Configuration(const Configuration&) = delete;
    Configuration & operator=(const Configuration&) = delete;

    //获取单例实例的静态方法
    static Configuration& get_Instance();

    //加载配置的方法
    bool load_from_file(const string & filename = "../conf/config.ini");
    void load_from_commandLine(int argc, char * argv[]);

    //配置读取含函数
    //获取字符串配置值
    string get_string(const string & key, const string & defaultValue = "") const;
    //获取整数配置值
    int get_int(const string & key, int defaultValue = 0) const;
    //获取布尔配置值
    bool get_bool(const string & key, bool defaultValue = false) const;

    //设置字符串配置值
    void set_string(const string & key, const string & value);
    //设置整数配置值
    void set_int(const string & key, int value);
    //设置布尔配置值
    void set_bool(const string & key, bool value);

    //工具函数
    //获取服务器主机地址
    string get_host() const { return get_string("server.host", "0.0.0.0"); }
    //获取服务器端口
    int get_port() const { return get_int("server.port", 8080); }
    //获取最大连接数
    int get_max_connections() const { return get_int("server.max_connections", 1000); }
    //获取线程池大小
    int get_thread_poolSize() const { return get_int("sever.thread_pool_size", 10); }
    //获取日志级别
    string get_logLevel() const { return get_string("sever.log_level", "INFO"); }
    //获取数据库URL
    string get_dataBaseUrl() const { return get_string("database.url", ""); }
    //获取数据库用户名
    string get_dataBaseuserName() const { return get_string("database.username", ""); }
    //获取数据库密码
    string get_dataBasepassword() const {return get_string("database.password", ""); }
    void display() const;

private:
    //私有化构造函数
    Configuration();
    //配置存储
    unordered_map<string, string> _configMap;
    //互斥锁用于线程安全
    mutable mutex _mutex;
    //解析INI文件行的辅助方法
    void parse_Ini_line(const string & line, string & currentSection);
    //解析命令行文件的辅助方法
    void parse_command_line_arg(const string & arg);
};
}//end of namespace jpx
#endif //CONFIGURATION_HPP
